2.4 第三方app对接代码示例
QQ音乐
qq音乐没有sdk,通过广播给qq音乐app发通知就行了。目前没有版本兼容问题,新旧版本都通用,但是新版本的qq音乐app体验会好一些。
示例代码:
public class QQMusicProxy {
private Context mContext;
private final static String PULL_FROM = "10026465";
public void openApp() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=0&pull_from=" + PULL_FROM + "&mb=true";
intent.setData(Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
public void exitApp() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=1&pull_from=10026465";
intent.setData(Uri.parse(uri));
mContext.sendBroadcast(intent);
}
public void play() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=0";
intent.setData(Uri.parse(uri));
mContext.sendBroadcast(intent);
}
public void pause() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=1";
intent.setData(Uri.parse(uri));
mContext.sendBroadcast(intent);
}
public void previous() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=2";
intent.setData(Uri.parse(uri));
mContext.sendBroadcast(intent);
}
public void next() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=3";
intent.setData(Uri.parse(uri));
mContext.sendBroadcast(intent);
}
public void collect() {
if (NetUtils.isNetworkAvailable()) {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=5";
intent.setData(Uri.parse(uri));
mContext.sendBroadcast(intent);
}
}
public void unCollect() {
if (NetUtils.isNetworkAvailable()) {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=6";
intent.setData(Uri.parse(uri));
mContext.sendBroadcast(intent);
}
}
public void setPlayMode(String playMode) {
Intent intent = new Intent();
if (TextUtils.equals(playMode, MediaProtocol.PlayMode.MODE_RANDOM)) {
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=105";
} else if (TextUtils.equals(playMode, MediaProtocol.PlayMode.MODE_INORDER)) {
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=103";
} else if (TextUtils.equals(playMode, MediaProtocol.PlayMode.MODE_CIRCLE)) { // QQ音乐没有专门的循环播放模式接口,循环播放和顺序播放是一样的
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=103";
} else if (TextUtils.equals(playMode, MediaProtocol.PlayMode.MODE_SINGLE)) {
String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=101";
}
intent.setData(Uri.parse(uri));
mContext.sendBroadcast(intent);
}
public void searchAndPlayMusic(MusicSearchKey musicSearchKey) {
// MusicSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
String keyWord = getMusicKeyWord(musicSearchKey); // getMusicKeyWord()方法在文章最后面定义
// qq音乐搜索接口
Intent intent = new Intent();
String uri = "qqmusiccar://?action=8&pull_from=" + PULL_FROM + "&mb=true ";
try {
uri += "&search_key=" + URLEncoder.encode(keyWord, "UTF-8") + "&m1=true";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
intent.setData(Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
// 播放qq音乐app中的“本地列表”列表
public void playLocalList() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=" + 3 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
intent.setData(Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
// 播放qq音乐app中的“车载音乐”列表
public void playCarMusicList() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=" + 5 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
intent.setData(Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
// 播放qq音乐app中的“车载电台”列表
public void playCarRadioList() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=" + 6 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
intent.setData(Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
// 播放qq音乐app中的“最近播放”列表
public void playLatestList() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=" + 2 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
intent.setData(Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
// 播放qq音乐app中的“我的音乐”列表
public void playMyMusicList() {
Intent intent = new Intent();
String uri = "qqmusiccar://?action=" + 4 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
intent.setData(Uri.parse(uri));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
}
酷我音乐
酷我音乐3.x版本需要使用酷我sdk_1.9.3,酷我音乐4.x版本需要使用酷我sdk_1.9.7。这两个sdk主要是搜索接口有一定差异,示例代码基于酷我sdk_1.9.7的。
示例代码
public class KuWoMusicProxy{
// 这里写客户公司与酷我对接的key
private final String appKey = "appKey";
private Context mContext;
private KWAPI mKwapi;
public KuWoMusicProxy(Context context) {
mContext = context;
mKwapi = KWAPI.createKWAPI(mContext, appKey);
// 如果需要监听状态的,需要注册如下监听
// mKwapi.registerPlayerStatusListener(xxx);
// mKwapi.registerPlayEndListener(xxx);
// mKwapi.registerExitListener(xxx);
// mKwapi.setFullScreen(xxx);
}
public void openApp(boolean autoPlay) {
mKwapi.startAPP(autoPlay);
}
public void exitApp() {
mKwapi.exitAPP();
}
public void play() {
mKwapi.setPlayState(PlayState.STATE_PLAY);
}
public void pause() {
mKwapi.setPlayState(PlayState.STATE_PAUSE);
}
public void previous() {
mKwapi.setPlayState(PlayState.STATE_PRE);
}
public void next() {
mKwapi.setPlayState(PlayState.STATE_NEXT);
}
public void setPlayMode(String mode) {
if (mode.equals(MediaProtocol.PlayMode.MODE_CIRCLE)) {//循环播放
mKwapi.setPlayMode(PlayMode.MODE_ALL_CIRCLE);
} else if (mode.equals(MediaProtocol.PlayMode.MODE_INORDER)) {//顺序播放
mKwapi.setPlayMode(PlayMode.MODE_ALL_ORDER);
} else if (mode.equals(MediaProtocol.PlayMode.MODE_RANDOM)) {//随机播放
mKwapi.setPlayMode(PlayMode.MODE_ALL_RANDOM);
} else if (mode.equals(MediaProtocol.PlayMode.MODE_SINGLE)) {//单曲循环
mKwapi.setPlayMode(PlayMode.MODE_SINGLE_CIRCLE);
}
}
// 播放本地音频文件,path:本地音频文件路径
public void playLocalMusic(String path) {
mKwapi.playLocalMusic(path);
}
public void searchAndPlayMusic(MusicSearchKey musicSearchKey) {
// MusicSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
MusicSearchKey musicSearchKey = new MusicSearchKey(duiData);
String song = musicSearchKey.getSongName();
String singer = musicSearchKey.getSingerName();
String album = musicSearchKey.getAlbum();
if (TextUtils.isEmpty(song) && TextUtils.isEmpty(singer)) {
// getMusicKeyWord()方法在文章最后面定义
String keyWord = MediaHelper.getInstance().getMusicKeyWord(musicSearchKey);
mKwapi.playClientMusicsByTheme(keyWord);
} else {
mKwapi.playClientMusics(song, singer, album);
}
}
}
喜马拉雅
喜马拉雅2.x和3.x使用的sdk是一样的,但是有部分接口使用不一样。
喜马拉雅2.x版本示例代码
/*
{"categoryName":"有声书","categoryId":3},
{"categoryName":"娱乐","categoryId":4},
{"categoryName":"相声评书","categoryId":12},
{"categoryName":"儿童","categoryId":6},
{"categoryName":"资讯","categoryId":1},
{"categoryName":"脱口秀","categoryId":28},
{"categoryName":"情感生活","categoryId":10},
{"categoryName":"历史","categoryId":9},
{"categoryName":"人文","categoryId":39},
{"categoryName":"英语","categoryId":38},
{"categoryName":"小语种","categoryId":32},
{"categoryName":"教育培训","categoryId":13},
{"categoryName":"广播剧","categoryId":15},
{"categoryName":"戏曲","categoryId":16},
{"categoryName":"国学书院","categoryId":40},
{"categoryName":"电台","categoryId":17},
{"categoryName":"商业财经","categoryId":8},
{"categoryName":"健康养生","categoryId":7},
{"categoryName":"旅游","categoryId":22},
{"categoryName":"汽车","categoryId":21},
{"categoryName":"动漫游戏","categoryId":24},
{"categoryName":"电影","categoryId":23},
{"categoryName":"党课随身听","categoryId":41},
{"categoryName":"名校公开课","categoryId":30},
{"categoryName":"时尚生活","categoryId":31},
{"categoryName":"诗歌","categoryId":34},
{"categoryName":"段子","categoryId":28}
* */
public class XmlyProxy{
// 这里的值记得改为公司与喜马拉雅对接的值
private static final String APPSECRET = "APPSECRET";
private static final String APPKEY = "APPKEY";
private static final String PACKID = "PACKID";
private Context mContext;
private SpeechControler mController;
public XmlyProxy(Context context) {
mContext = context;
initController();
}
private void initController() {
try {
mController = SpeechControler.getInstance(mContext);
mController.init(APPSECRET, APPKEY, PACKID);
} catch (Exception e) {
e.printStackTrace();
try {
Intent intent = new Intent();
intent.setData(Uri.parse("tingcar://open"));
mContext.startActivity(intent);
} catch (Exception ex) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mController = SpeechControler.getInstance(mContext);
mController.init(APPSECRET, APPKEY, PACKID);
}
}, 2000);
}
}
}
private void sdkPlayDelay(final long time) {
ThreadPoolManager.getInstance().addAsyncTask(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
mController.play();
}
});
}
public void openApp(String pkgName, boolean autoPlay) {
Intent intent = new Intent();
intent.setData(Uri.parse("tingcar://open"));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
// 启动之后自动播放
sdkPlayDelay(3000);
}
public void exitApp(String pkgName) {
mController.stopAndExitApp();
}
public void play() {
mController.play();
}
public void pause() {
mController.pause();
}
public void previous() {
mController.playPre();
}
public void next() {
mController.playNext();
}
public void collect() {
mController.collectAlbum(mController.getCurrentTrack().getAlbum().getAlbumId(), null);
}
public void unCollect() {
mController.unCollectAlbum(mController.getCurrentTrack().getAlbum().getAlbumId(), null);
}
public void searchAndPlayRadio(RadioSearchKey radioSearchKey) {
// RadioSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
// getRadioKeyWord()方法在文章最后面定义
String keyword = getRadioKeyWord(radioSearchKey);
// categoryId由RadioSearchKey中category字段的值,根据开头那个对照表得到
int categoryId = 12; // 假设category字段的值是"相声",对应的类别是"相声评书",id就是12
// 喜马拉雅sdk搜索并播放
mController.getSourseLists(keyword, categoryId, 1, 10, 2, new IMainDataCallback<SearchTrackList>() {
@Override
public void successCallBack(SearchTrackList searchTrackList) {
final List<Track> listAudios = searchTrackList.getTracks();
if (listAudios != null && listAudios.size() > 0) {
mController.playTrackList(listAudios, 0, new IMainDataCallback<String>() {
@Override
public void successCallBack(String s) {
}
@Override
public void errCallBack(String s) {
}
});
}
}
@Override
public void errCallBack(String s) {
}
});
}
}
喜马拉雅3.x版本示例代码
public class XmlyProxy{
// 这里改为客户公司跟喜马拉雅对接的key
String secret = "secret";
String key = "key";
String id = "id";
private Context mContext;
private SpeechControler mController;
public XmlyProxy(Context context) {
mContext = context;
initController();
}
private void initController() {
try {
String secret = AssetsUtil.readProp(mContext, MusicProtocol.AssetKey.XMLYSECRET);
String key = AssetsUtil.readProp(mContext, MusicProtocol.AssetKey.XMLYKEY);
String id = AssetsUtil.readProp(mContext, MusicProtocol.AssetKey.XMLYPACKID);
mController = SpeechControler.getInstance(mContext);
mController.init(secret, key, id);
} catch (Exception e) {
e.printStackTrace();
}
}
public void openApp(boolean autoPlay) {
Intent intent = new Intent();
intent.setData(Uri.parse("tingcar://open?to_fragment=to_fragment"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
mContext.startActivity(intent);
}
public void exitApp() {
mController.stopAndExitApp();
}
public void play() {
mController.play();
}
public void pause() {
mController.pause();
}
public void previous() {
mController.playPre();
}
public void next() {
mController.playNext();
}
public void collect() {
mController.collectAlbum(mController.getCurrentTrack().getAlbum().getAlbumId(), null);
}
public void unCollect() {
mController.unCollectAlbum(mController.getCurrentTrack().getAlbum().getAlbumId(), null);
}
public void searchAndPlayRadio(RadioSearchKey radioSearchKey) {
// RadioSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
// getRadioKeyWord()方法在文章最后面定义
String keyword = getRadioKeyWord(radioSearchKey);
mController.getSourseLists(keyword, 0, 1, 3, 1, new IMainDataCallback<SearchAlbumList>() {
@Override
public void successCallBack(SearchAlbumList searchAlbumList) {
final List<Album> listAlbum = searchAlbumList.getAlbums();
if (null == listAlbum || listAlbum.size() <= 0) {
return;
}
Album album = listAlbum.get(0);
if (null == album) {
return;
}
mController.browseAlbums(album.getId(), 1, 50, new IMainDataCallback<CommonTrackList<Track>>() {
@Override
public void successCallBack(CommonTrackList<Track> trackCommonTrackList) {
mController.setPlayByAlbumTracks(trackCommonTrackList, 0, new IMainDataCallback<String>() {
@Override
public void successCallBack(String s) {
}
@Override
public void errCallBack(String s) {
}
});
}
@Override
public void errCallBack(String s) {
}
});
}
@Override
public void errCallBack(String s) {
}
});
}
}
考拉
示例代码
public class KaoLaProxy {
private Context mContext;
private KLClientAPI mKLClient;
public KaoLaProxy(Context context) {
mContext = context;
mKLClient = KLClientAPI.getInstance();
mKLClient.init(context, KLClientAPI.KEY_AUTO);
}
public void openApp(boolean autoPlay) {
mKLClient.launchApp(true);
}
public void exitApp() {
mKLClient.exitApp();
}
public void play() {
mKLClient.play();
}
public void pause() {
mKLClient.pause();
}
public void previous() {
mKLClient.playPre();
}
public void next() {
mKLClient.playNext();
}
public void searchAndPlayRadio(RadioSearchKey radioSearchKey) {
// RadioSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
// getRadioKeyWord()方法在文章最后面定义
mKLClient.play(getRadioKeyWord(radioSearchKey), new PlayResult() {
@Override
public void onSuccuss() {
}
@Override
public void onFailure(ErrorInfo errorInfo) {
}
});
}
}
getMusicKeyWord和getRadioKeyWord方法
getMusicKeyWord
private String getMusicKeyWord(MusicSearchKey searchKey) {
if (null == searchKey) {
return "";
}
StringBuilder sb = new StringBuilder();
if (!TextUtils.isEmpty(searchKey.getLanguage())) {
if (searchKey.getLanguage().contains("歌")) {
sb.append(searchKey.getLanguage());
} else {
sb.append(searchKey.getLanguage()).append("歌");
}
}
if (!TextUtils.isEmpty(searchKey.getAlbum())) {
sb.append(searchKey.getAlbum()).append("专辑");
}
if (!TextUtils.isEmpty(searchKey.getSingerSex())) {
if (TextUtils.equals("男生", searchKey.getSingerSex())) {
sb.append("男歌手");
} else if (TextUtils.equals("女生", searchKey.getSingerSex())) {
sb.append("女歌手");
} else {
sb.append(searchKey.getSingerSex());
}
}
sb.append(searchKey.getMusicStyle())
.append(searchKey.getSongName())
.append(searchKey.getSingerName())
.append(searchKey.getInstrument())
.append(searchKey.getYears())
.append(searchKey.getBoard())
.append(searchKey.getAge())
.append(searchKey.getCrowd())
.append(searchKey.getMusicScene())
.append(searchKey.getMusicType())
.append(searchKey.getMusicSource())
.append(searchKey.getTheme())
.append(searchKey.getThemeSongType());
String keyWord = sb.toString().trim();
return keyWord;
}
getRadioKeyWord
private String getRadioKeyWord(RadioSearchKey searchKey) {
if (null == searchKey) {
return "";
}
StringBuilder sb = new StringBuilder();
sb.append(searchKey.getProgram())
.append(searchKey.getSinger())
.append(searchKey.getCategory())
.append(searchKey.getObject())
.append(searchKey.getColumn())
.append(searchKey.getAnyTxt())
.append(searchKey.getSerialNum())
.append(searchKey.getCategory1())
.append(searchKey.getCategory2())
.append(searchKey.getColumn1())
.append(searchKey.getColumn2())
.append(searchKey.getPlayAction());
String keyWord = sb.toString().trim();
return keyWord;
}